/*
 * Parser.cpp
 *
 *  Created on: 10/09/2010
 *      Author: julfc
 */

#include "Parser.h"

Parser::Parser() {
}

bool Parser::ValidarFiltro(string filtro) {
	if (filtro[0] != '[')
		return false;

	if (filtro[filtro.length() - 1] != ']')
		return false;

	int posicionIgual = filtro.find_first_of('=');

	string nombreFiltro;
	string condicionFiltro;

	if(posicionIgual > 0)
	{
		int len= filtro.length();
		nombreFiltro = filtro.substr(1, posicionIgual - 1);
		condicionFiltro = filtro.substr(posicionIgual + 1, len - nombreFiltro.length() -3 );

		if((!ValidarPartes(nombreFiltro)) || (!ValidarPartes(condicionFiltro)))
			return false;
	}

	return true;
}

bool Parser::EsBusquedaClasificacion(string filtroBusqueda)
{
	return (filtroBusqueda.find('=') != -1);
}

string Parser::ObtenerNombreFiltro(string filtro, bool seleccion) {
	string nombreFiltro;
	if (seleccion)
	{
		int posicionIgual = filtro.find_first_of('=');
		return filtro.substr(1, posicionIgual - 1);
	}
	else
	{
		return filtro.substr(1, filtro.length() - 2);
	}
}

string Parser::ObtenerCondicionFiltro(string filtro) {
	string condicionFiltro;
	string nombreFiltro;

	int posicionIgual = filtro.find_first_of('=');

	int len= filtro.length();
	nombreFiltro = filtro.substr(1, posicionIgual - 1);
	condicionFiltro = filtro.substr(posicionIgual + 1, len - nombreFiltro.length() -3 );

	return condicionFiltro;
}

bool Parser::ValidarPartes(string parte){

	int posicion;
	vector<string> caracteresVarios;

	caracteresVarios.push_back("=");
	caracteresVarios.push_back("&");
//	caracteresVarios.push_back("[");
//	caracteresVarios.push_back("]");
//	caracteresVarios.push_back("{");
//	caracteresVarios.push_back("}");
	caracteresVarios.push_back("%");
	caracteresVarios.push_back("$");
	caracteresVarios.push_back("/");
	caracteresVarios.push_back("\\");
	caracteresVarios.push_back("<");
	caracteresVarios.push_back(">");

	for(int i = 0; i < caracteresVarios.size(); i++)
	{
		if(parte.find(caracteresVarios[i]) != -1)
			return false;
	}

	return true;
}

string Parser::parsearFecha(string cadena) {

	vector<string> partes = Split(cadena, "*");
	if (partes.size() == 3) {
		string fecha =  partes[0] + " " + partes[1] + " " + partes[2];
		return fecha;
	}
	return "";
}

string Parser::parsearAsunto(string cadena) {
	string asunto = "";
	vector<string> partes = Split(cadena, "*");
	if (partes.size() > 0) {
		for (unsigned int i = 0; i < partes.size(); i++) {
			asunto.append(partes[i]);
			if (i != (partes.size() - 1))
				asunto.append(" ");
		}
	}
	return asunto;
}

vector<string> Parser::Split(string str, string delimitador){
	int pos;
	vector<string> resultado;
	while( (pos = str.find_first_of(delimitador)) != str.npos ){
	if(pos > 0){
		resultado.push_back(str.substr(0,pos));
	}
	str = str.substr(pos+1);
	}
	if(str.length() > 0){
	resultado.push_back(str);
	}
	return resultado;
}

void Parser::upper(string &instruccion) {
    string::iterator i = instruccion.begin();
    string::iterator end = instruccion.end();
    while(i != end) {
        *i = toupper((unsigned char)(*i));
        ++i;
    }
}

vector<string> Parser::balancearCadena(vector<string> cadena) {
	vector<string> resp;
	for (unsigned int i = 0; i < cadena.size(); i++) {
		string stringAux;
		string cadenaAux = cadena[i];
		if(cadenaAux.length() < 200) {
			stringAux.append(cadenaAux);
			for(int j = cadenaAux.length(); j < 200; j++)
				stringAux.append("*");
		} else {
			stringAux.append(cadenaAux.substr(0, 200));
		}
		resp.push_back(stringAux);
	}
	return resp;
}

string Parser::integerToString(int integer) {
  ostringstream stream;
  stream << integer;
  return stream.str();
}

Parser::~Parser() {
}
